from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base


class SQLAlchemyUtils:
    """
    SQLAlchemy工具类，用于创建和管理SQLAlchemy的引擎、会话等。
    """

    def __init__(self, database_url):
        """
        初始化SQLAlchemy工具类。

        参数:
        - database_url: 数据库连接URL，例如'sqlite:///example.db'或'mysql+pymysql://user:password@localhost/dbname'。
        """
        self.engine = create_engine(database_url, echo=True)  # 创建引擎
        self.Session = scoped_session(sessionmaker(bind=self.engine))  # 创建会话
        self.Base = declarative_base()  # 创建ORM基类

    def create_table(self, model_class):
        """
        创建数据库表。

        参数:
        - model_class: 继承自self.Base的ORM模型类。
        """
        self.Base.metadata.create_all(self.engine)

    def execute_query(self, query):
        """
        执行查询并返回结果。

        参数:
        - query: SQLAlchemy查询对象。
        """
        with self.Session() as session:
            result = session.execute(query)
            return result.fetchall()

    def add_to_session(self, instance):
        """
        将对象添加到会话中。

        参数:
        - instance: 继承自self.Base的ORM实例。
        """
        with self.Session() as session:
            session.add(instance)
            session.commit()

    def delete_from_session(self, instance):
        """
        从会话中删除对象。

        参数:
        - instance: 继承自self.Base的ORM实例。
        """
        with self.Session() as session:
            session.delete(instance)
            session.commit()

    def update_data(self, instance):
        """
        更新会话中的数据。

        参数:
        - instance: 继承自self.Base的ORM实例，该实例包含已更新的数据。
        """
        with self.Session() as session:
            session.merge(instance)
            session.commit()

    def bulk_insert_data(self, model_class, data_list):
        """
        批量插入数据到数据库。

        参数:
        - model_class: 继承自self.Base的ORM模型类。
        - data_list: 包含要插入的数据的列表，每个元素是模型类的实例。
        """
        with self.Session() as session:
            session.add_all(data_list)
            session.commit()



    def close_session(self):
        """
        关闭会话。
        """
        self.Session.remove()